home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume24 / gnucalc / part14 < prev    next >
Encoding:
Text File  |  1991-10-29  |  55.5 KB  |  1,956 lines

  1. Newsgroups: comp.sources.misc
  2. From: daveg@synaptics.com (David Gillespie)
  3. Subject:  v24i062:  gnucalc - GNU Emacs Calculator, v2.00, Part14/56
  4. Message-ID: <1991Oct29.230222.20425@sparky.imd.sterling.com>
  5. X-Md4-Signature: 8ab1d10bd41b861c79fc9a0e271f28f2
  6. Date: Tue, 29 Oct 1991 23:02:22 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: daveg@synaptics.com (David Gillespie)
  10. Posting-number: Volume 24, Issue 62
  11. Archive-name: gnucalc/part14
  12. Environment: Emacs
  13. Supersedes: gmcalc: Volume 13, Issue 27-45
  14.  
  15. ---- Cut Here and unpack ----
  16. #!/bin/sh
  17. # do not concatenate these parts, unpack them in order with /bin/sh
  18. # file calc-ext.el continued
  19. #
  20. if test ! -r _shar_seq_.tmp; then
  21.     echo 'Please unpack part 1 first!'
  22.     exit 1
  23. fi
  24. (read Scheck
  25.  if test "$Scheck" != 14; then
  26.     echo Please unpack part "$Scheck" next!
  27.     exit 1
  28.  else
  29.     exit 0
  30.  fi
  31. ) < _shar_seq_.tmp || exit 1
  32. if test ! -f _shar_wnt_.tmp; then
  33.     echo 'x - still skipping calc-ext.el'
  34. else
  35. echo 'x - continuing file calc-ext.el'
  36. sed 's/^X//' << 'SHAR_EOF' >> 'calc-ext.el' &&
  37. calc-store-quick calc-store-times calc-subscript calc-unstore)
  38. X
  39. X ("calc-stuff" calc-clean calc-clean-num calc-flush-caches
  40. calc-less-recursion-depth calc-more-recursion-depth calc-num-prefix
  41. calc-version calc-why)
  42. X
  43. X ("calc-trail" calc-trail-backward calc-trail-first calc-trail-forward
  44. calc-trail-in calc-trail-isearch-backward calc-trail-isearch-forward
  45. calc-trail-kill calc-trail-last calc-trail-marker calc-trail-next
  46. calc-trail-out calc-trail-previous calc-trail-scroll-left
  47. calc-trail-scroll-right calc-trail-yank)
  48. X
  49. X ("calc-undo" calc-last-args calc-redo calc-undo)
  50. X
  51. X ("calc-units" calc-autorange-units calc-base-units
  52. calc-convert-temperature calc-convert-units calc-define-unit
  53. calc-enter-units-table calc-explain-units calc-extract-units
  54. calc-get-unit-definition calc-permanent-units calc-remove-units
  55. calc-simplify-units calc-undefine-unit calc-view-units-table)
  56. X
  57. X ("calc-vec" calc-arrange-vector calc-build-vector calc-cnorm
  58. calc-conj-transpose calc-cons calc-cross calc-diag
  59. calc-display-strings calc-expand-vector calc-grade calc-head
  60. calc-histogram calc-ident calc-index calc-mask-vector calc-mcol
  61. calc-mrow calc-pack calc-pack-bits calc-remove-duplicates
  62. calc-reverse-vector calc-rnorm calc-set-cardinality
  63. calc-set-complement calc-set-difference calc-set-enumerate
  64. calc-set-floor calc-set-intersect calc-set-span calc-set-union
  65. calc-set-xor calc-sort calc-subvector calc-tail calc-transpose
  66. calc-unpack calc-unpack-bits calc-vector-find calc-vlength)
  67. X
  68. X ("calc-yank" calc-copy-as-kill calc-copy-region-as-kill
  69. calc-copy-to-buffer calc-edit calc-edit-cancel calc-edit-mode
  70. calc-kill calc-kill-region calc-yank)
  71. X
  72. ))
  73. X
  74. )
  75. X
  76. (defun calc-init-prefixes ()
  77. X  (if calc-shift-prefix
  78. X      (progn
  79. X    (aset calc-mode-map ?A (aref calc-mode-map ?a))
  80. X    (aset calc-mode-map ?B (aref calc-mode-map ?b))
  81. X    (aset calc-mode-map ?C (aref calc-mode-map ?c))
  82. X    (aset calc-mode-map ?D (aref calc-mode-map ?d))
  83. X    (aset calc-mode-map ?F (aref calc-mode-map ?f))
  84. X    (aset calc-mode-map ?G (aref calc-mode-map ?g))
  85. X    (aset calc-mode-map ?J (aref calc-mode-map ?j))
  86. X    (aset calc-mode-map ?K (aref calc-mode-map ?k))
  87. X    (aset calc-mode-map ?M (aref calc-mode-map ?m))
  88. X    (aset calc-mode-map ?S (aref calc-mode-map ?s))
  89. X    (aset calc-mode-map ?T (aref calc-mode-map ?t))
  90. X    (aset calc-mode-map ?U (aref calc-mode-map ?u)))
  91. X    (define-key calc-mode-map "A" 'calc-abs)
  92. X    (define-key calc-mode-map "B" 'calc-log)
  93. X    (define-key calc-mode-map "C" 'calc-cos)
  94. X    (define-key calc-mode-map "D" 'calc-redo)
  95. X    (define-key calc-mode-map "F" 'calc-floor)
  96. X    (define-key calc-mode-map "G" 'calc-argument)
  97. X    (define-key calc-mode-map "J" 'calc-conj)
  98. X    (define-key calc-mode-map "K" 'calc-keep-args)
  99. X    (define-key calc-mode-map "M" 'calc-more-recursion-depth)
  100. X    (define-key calc-mode-map "S" 'calc-sin)
  101. X    (define-key calc-mode-map "T" 'calc-tan)
  102. X    (define-key calc-mode-map "U" 'calc-undo))
  103. )
  104. X
  105. (calc-init-extensions)
  106. X
  107. X
  108. X
  109. X
  110. ;;;; Miscellaneous.
  111. X
  112. (defun calc-clear-command-flag (f)
  113. X  (setq calc-command-flags (delq f calc-command-flags))
  114. )
  115. X
  116. X
  117. (defun calc-record-message (tag &rest args)
  118. X  (let ((msg (apply 'format args)))
  119. X    (message "%s" msg)
  120. X    (calc-record msg tag))
  121. X  (calc-clear-command-flag 'clear-message)
  122. )
  123. X
  124. X
  125. (defun calc-normalize-fancy (val)
  126. X  (let ((simp (if (consp calc-simplify-mode)
  127. X          (car calc-simplify-mode)
  128. X        calc-simplify-mode)))
  129. X    (cond ((eq simp 'binary)
  130. X       (let ((s (math-normalize val)))
  131. X         (if (math-realp s)
  132. X         (math-clip (math-round s))
  133. X           s)))
  134. X      ((eq simp 'alg)
  135. X       (math-simplify val))
  136. X      ((eq simp 'ext)
  137. X       (math-simplify-extended val))
  138. X      ((eq simp 'units)
  139. X       (math-simplify-units val))
  140. X      (t  ; nil, none, num
  141. X       (math-normalize val))))
  142. )
  143. X
  144. X
  145. X
  146. (if (boundp 'calc-help-map)
  147. X    nil
  148. X  (setq calc-help-map (make-keymap))
  149. X  (define-key calc-help-map "b" 'calc-describe-bindings)
  150. X  (define-key calc-help-map "c" 'calc-describe-key-briefly)
  151. X  (define-key calc-help-map "f" 'calc-describe-function)
  152. X  (define-key calc-help-map "h" 'calc-full-help)
  153. X  (define-key calc-help-map "i" 'calc-info)
  154. X  (define-key calc-help-map "k" 'calc-describe-key)
  155. X  (define-key calc-help-map "n" 'calc-view-news)
  156. X  (define-key calc-help-map "s" 'calc-info-summary)
  157. X  (define-key calc-help-map "t" 'calc-tutorial)
  158. X  (define-key calc-help-map "v" 'calc-describe-variable)
  159. X  (define-key calc-help-map "\C-c" 'calc-describe-copying)
  160. X  (define-key calc-help-map "\C-d" 'calc-describe-distribution)
  161. X  (define-key calc-help-map "\C-n" 'calc-view-news)
  162. X  (define-key calc-help-map "\C-w" 'calc-describe-no-warranty)
  163. X  (define-key calc-help-map "?" 'calc-help-for-help)
  164. X  (define-key calc-help-map "\C-h" 'calc-help-for-help)
  165. )
  166. X
  167. X
  168. (defun calc-do-prefix-help (msgs group key)
  169. X  (if calc-full-help-flag
  170. X      (list msgs group key)
  171. X    (if (cdr msgs)
  172. X    (progn
  173. X      (setq calc-prefix-help-phase
  174. X        (if (eq this-command last-command)
  175. X            (% (1+ calc-prefix-help-phase) (1+ (length msgs)))
  176. X          0))
  177. X      (let ((msg (nth calc-prefix-help-phase msgs)))
  178. X        (message "%s" (if msg
  179. X                  (concat group ": " msg ":"
  180. X                      (make-string
  181. X                       (- (apply 'max (mapcar 'length msgs))
  182. X                      (length msg)) 32)
  183. X                      "  [MORE]"
  184. X                      (if key
  185. X                      (concat "  " (char-to-string key)
  186. X                          "-")
  187. X                    ""))
  188. X                (if key (format "%c-" key) "")))))
  189. X      (setq calc-prefix-help-phase 0)
  190. X      (if key
  191. X      (if msgs
  192. X          (message (concat group ": " (car msgs) ":  "
  193. X                   (char-to-string key) "-"))
  194. X        (message (concat group ": (none)  " (char-to-string key) "-")))
  195. X    (message (concat group ": " (car msgs)))))
  196. X    (and key
  197. X     (setq unread-command-char key)))
  198. )
  199. (defvar calc-prefix-help-phase 0)
  200. X
  201. X
  202. X
  203. X
  204. ;;;; Commands.
  205. X
  206. X
  207. ;;; General.
  208. X
  209. (defun calc-reset (arg)
  210. X  (interactive "P")
  211. X  (save-excursion
  212. X    (or (eq major-mode 'calc-mode)
  213. X    (calc-create-buffer))
  214. X    (if calc-embedded-info
  215. X    (calc-embedded nil))
  216. X    (or arg
  217. X    (setq calc-stack nil))
  218. X    (setq calc-undo-list nil
  219. X      calc-redo-list nil)
  220. X    (let (calc-stack)
  221. X      (mapcar (function (lambda (v) (set v nil))) calc-local-var-list))
  222. X    (mapcar (function (lambda (v) (set (car v) (nth 1 v)))) calc-mode-var-list)
  223. X    (calc-set-language nil nil t)
  224. X    (calc-mode)
  225. X    (let ((executing-kbd-macro ""))  ; inhibit message
  226. X      (calc-flush-caches))
  227. X    (run-hooks 'calc-reset-hook))
  228. X  (calc-wrapper
  229. X   (let ((win (get-buffer-window (current-buffer))))
  230. X     (calc-realign 0)
  231. X     (if win
  232. X     (let ((height (- (window-height win) 2)))
  233. X       (set-window-point win (point))
  234. X       (or (= height calc-window-height)
  235. X           (let ((swin (selected-window)))
  236. X         (select-window win)
  237. X         (enlarge-window (- calc-window-height height))
  238. X         (select-window swin)))))))
  239. X  (message "(Calculator reset)")
  240. )
  241. X
  242. X
  243. (defun calc-scroll-left (n)
  244. X  (interactive "P")
  245. X  (scroll-left (or n (/ (window-width) 2)))
  246. )
  247. X
  248. (defun calc-scroll-right (n)
  249. X  (interactive "P")
  250. X  (scroll-right (or n (/ (window-width) 2)))
  251. )
  252. X
  253. (defun calc-scroll-up (n)
  254. X  (interactive "P")
  255. X  (condition-case err
  256. X      (scroll-up (or n (/ (window-height) 2)))
  257. X    (error nil))
  258. X  (if (pos-visible-in-window-p (max 1 (- (point-max) 2)))
  259. X      (if (eq major-mode 'calc-mode)
  260. X      (calc-realign)
  261. X    (goto-char (point-max))
  262. X    (set-window-start (selected-window)
  263. X              (save-excursion
  264. X                (forward-line (- (1- (window-height))))
  265. X                (point)))
  266. X    (forward-line -1)))
  267. )
  268. X
  269. (defun calc-scroll-down (n)
  270. X  (interactive "P")
  271. X  (or (pos-visible-in-window-p 1)
  272. X      (scroll-down (or n (/ (window-height) 2))))
  273. )
  274. X
  275. X
  276. (defun calc-precision (n)
  277. X  (interactive "NPrecision: ")
  278. X  (calc-wrapper
  279. X   (if (< (prefix-numeric-value n) 3)
  280. X       (error "Precision must be at least 3 digits.")
  281. X     (calc-change-mode 'calc-internal-prec (prefix-numeric-value n)
  282. X               (and (memq (car calc-float-format) '(float sci eng))
  283. X                (< (nth 1 calc-float-format)
  284. X                (if (= calc-number-radix 10) 0 1))))
  285. X     (calc-record calc-internal-prec "prec"))
  286. X   (message "Floating-point precision is %d digits." calc-internal-prec))
  287. )
  288. X
  289. X
  290. (defun calc-inverse (&optional n)
  291. X  (interactive "P")
  292. X  (calc-fancy-prefix 'calc-inverse-flag "Inverse..." n)
  293. )
  294. X
  295. (defun calc-fancy-prefix (flag msg arg)
  296. X  (let (prefix)
  297. X    (calc-wrapper
  298. X     (calc-set-command-flag 'keep-flags)
  299. X     (calc-set-command-flag 'no-align)
  300. X     (setq prefix (set flag (not (symbol-value flag)))
  301. X       prefix-arg n)
  302. X     (message (if prefix msg "")))
  303. X    (and prefix
  304. X     (not calc-is-keypad-press)
  305. X     (if (eq (setq last-command-char (read-char)) ?\C-u)
  306. X         (universal-argument)
  307. X       (if (and (< last-command-char ? )
  308. X            (not (memq last-command-char '(?\e))))
  309. X           (calc-wrapper))  ; clear flags if not a Calc command.
  310. X       (if (eq last-command-char ?-)
  311. X           (setq unread-command-char last-command-char)
  312. X         (digit-argument n)))))
  313. )
  314. (setq calc-is-keypad-press nil)
  315. X
  316. (defun calc-invert-func ()
  317. X  (save-excursion
  318. X    (calc-select-buffer)
  319. X    (setq calc-inverse-flag (not (calc-is-inverse))
  320. X      calc-hyperbolic-flag (calc-is-hyperbolic)
  321. X      current-prefix-arg nil))
  322. )
  323. X
  324. (defun calc-is-inverse ()
  325. X  calc-inverse-flag
  326. )
  327. X
  328. (defun calc-hyperbolic (&optional n)
  329. X  (interactive "P")
  330. X  (calc-fancy-prefix 'calc-hyperbolic-flag "Hyperbolic..." n)
  331. )
  332. X
  333. (defun calc-hyperbolic-func ()
  334. X  (save-excursion
  335. X    (calc-select-buffer)
  336. X    (setq calc-inverse-flag (calc-is-inverse)
  337. X      calc-hyperbolic-flag (not (calc-is-hyperbolic))
  338. X      current-prefix-arg nil))
  339. )
  340. X
  341. (defun calc-is-hyperbolic ()
  342. X  calc-hyperbolic-flag
  343. )
  344. X
  345. (defun calc-keep-args (&optional n)
  346. X  (interactive "P")
  347. X  (calc-fancy-prefix 'calc-keep-args-flag "Keep args..." n)
  348. )
  349. X
  350. X
  351. (defun calc-change-mode (var value &optional refresh option)
  352. X  (if option
  353. X      (setq value (if value
  354. X              (> (prefix-numeric-value value) 0)
  355. X            (not (symbol-value var)))))
  356. X  (or (consp var) (setq var (list var) value (list value)))
  357. X  (if calc-inverse-flag
  358. X      (let ((old nil))
  359. X    (or refresh (error "Not a display-mode command"))
  360. X    (calc-check-stack 1)
  361. X    (unwind-protect
  362. X        (let ((v var))
  363. X          (while v
  364. X        (setq old (cons (symbol-value (car v)) old))
  365. X        (set (car v) (car value))
  366. X        (setq v (cdr v)
  367. X              value (cdr value)))
  368. X          (calc-refresh-top 1)
  369. X          (calc-refresh-evaltos)
  370. X          (symbol-value (car var)))
  371. X      (let ((v var))
  372. X        (setq old (nreverse old))
  373. X        (while v
  374. X          (set (car v) (car old))
  375. X          (setq v (cdr v)
  376. X            old (cdr old)))
  377. X        (if (eq (car var) 'calc-language)
  378. X        (calc-set-language calc-language calc-language-option t)))))
  379. X    (let ((chg nil)
  380. X      (v var))
  381. X      (while v
  382. X    (or (equal (symbol-value (car v)) (car value))
  383. X        (progn
  384. X          (set (car v) (car value))
  385. X          (if (eq (car v) 'calc-float-format)
  386. X          (setq calc-full-float-format
  387. X            (list (if (eq (car (car value)) 'fix)
  388. X                  'float
  389. X                (car (car value)))
  390. X                  0)))
  391. X          (setq chg t)))
  392. X    (setq v (cdr v)
  393. X          value (cdr value)))
  394. X      (if chg
  395. X      (progn
  396. X        (or (and refresh (calc-do-refresh))
  397. X        (calc-refresh-evaltos))
  398. X        (and (eq calc-mode-save-mode 'save)
  399. X         (not (equal var '(calc-mode-save-mode)))
  400. X         (calc-save-modes t))))
  401. X      (if calc-embedded-info (calc-embedded-modes-change var))
  402. X      (symbol-value (car var))))
  403. )
  404. X
  405. (defun calc-refresh-top (n)
  406. X  (interactive "p")
  407. X  (calc-wrapper
  408. X   (cond ((< n 0)
  409. X      (setq n (- n))
  410. X      (let ((entry (calc-top n 'entry))
  411. X        (calc-undo-list nil) (calc-redo-list nil))
  412. X        (calc-pop-stack 1 n t)
  413. X        (calc-push-list (list (car entry)) n (list (nth 2 entry)))))
  414. X     ((= n 0)
  415. X      (calc-refresh))
  416. X     (t
  417. X      (let ((entries (calc-top-list n 1 'entry))
  418. X        (calc-undo-list nil) (calc-redo-list nil))
  419. X        (calc-pop-stack n 1 t)
  420. X        (calc-push-list (mapcar 'car entries)
  421. X                1
  422. X                (mapcar (function (lambda (x) (nth 2 x)))
  423. X                    entries))))))
  424. )
  425. X
  426. (defun calc-refresh-evaltos (&optional which-var)
  427. X  (and calc-any-evaltos calc-auto-recompute (not calc-no-refresh-evaltos)
  428. X       (let ((calc-refreshing-evaltos t)
  429. X         (num (calc-stack-size))
  430. X         (calc-undo-list nil) (calc-redo-list nil)
  431. X         value new-val)
  432. X     (while (> num 0)
  433. X       (setq value (calc-top num 'entry))
  434. X       (if (and (not (nth 2 value))
  435. X            (setq value (car value))
  436. X            (or (eq (car-safe value) 'calcFunc-evalto)
  437. X            (and (eq (car-safe value) 'vec)
  438. X                 (eq (car-safe (nth 1 value)) 'calcFunc-evalto))))
  439. X           (progn
  440. X         (setq new-val (math-normalize value))
  441. X         (or (equal new-val value)
  442. X             (progn
  443. X               (calc-push-list (list new-val) num)
  444. X               (calc-pop-stack 1 (1+ num) t)))))
  445. X       (setq num (1- num)))))
  446. X  (and calc-embedded-active which-var
  447. X       (calc-embedded-var-change which-var))
  448. )
  449. (setq calc-refreshing-evaltos nil)
  450. (setq calc-no-refresh-evaltos nil)
  451. X
  452. X
  453. (defun calc-push (&rest vals)
  454. X  (calc-push-list vals)
  455. )
  456. X
  457. (defun calc-pop-push (n &rest vals)
  458. X  (calc-pop-push-list n vals)
  459. )
  460. X
  461. (defun calc-pop-push-record (n prefix &rest vals)
  462. X  (calc-pop-push-record-list n prefix vals)
  463. )
  464. X
  465. X
  466. (defun calc-evaluate (n)
  467. X  (interactive "p")
  468. X  (calc-slow-wrapper
  469. X   (if (= n 0)
  470. X       (setq n (calc-stack-size)))
  471. X   (calc-with-default-simplification
  472. X    (if (< n 0)
  473. X    (calc-pop-push-record-list 1 "eval"
  474. X                   (math-evaluate-expr (calc-top (- n)))
  475. X                   (- n))
  476. X      (calc-pop-push-record-list n "eval" (mapcar 'math-evaluate-expr
  477. X                          (calc-top-list n)))))
  478. X   (calc-handle-whys))
  479. )
  480. X
  481. X
  482. (defun calc-eval-num (n)
  483. X  (interactive "P")
  484. X  (calc-slow-wrapper
  485. X   (let* ((nn (prefix-numeric-value n))
  486. X      (calc-internal-prec (cond ((>= nn 3) nn)
  487. X                    ((< nn 0) (max (+ calc-internal-prec nn)
  488. X                           3))
  489. X                    (t calc-internal-prec)))
  490. X      (calc-symbolic-mode nil))
  491. X     (calc-with-default-simplification
  492. X      (calc-pop-push-record 1 "num" (math-evaluate-expr (calc-top 1)))))
  493. X   (calc-handle-whys))
  494. )
  495. X
  496. X
  497. (defun calc-execute-extended-command (n)
  498. X  (interactive "P")
  499. X  (let* ((prompt (concat (calc-num-prefix-name n) "M-x "))
  500. X     (cmd (intern (completing-read prompt obarray 'commandp t "calc-"))))
  501. X    (setq prefix-arg n)
  502. X    (command-execute cmd))
  503. )
  504. X
  505. X
  506. (defun calc-realign (&optional num)
  507. X  (interactive "P")
  508. X  (if (and num (eq major-mode 'calc-mode))
  509. X      (progn
  510. X    (calc-check-stack num)
  511. X    (calc-cursor-stack-index num)
  512. X    (and calc-line-numbering
  513. X         (forward-char 4)))
  514. X    (if (and calc-embedded-info
  515. X         (eq (current-buffer) (aref calc-embedded-info 0)))
  516. X    (progn
  517. X      (goto-char (aref calc-embedded-info 2))
  518. X      (if (save-excursion (set-buffer (aref calc-embedded-info 1))
  519. X                  calc-show-plain)
  520. X          (forward-line 1)))
  521. X      (calc-wrapper
  522. X       (if (get-buffer-window (current-buffer))
  523. X       (set-window-hscroll (get-buffer-window (current-buffer)) 0)))))
  524. )
  525. X
  526. X
  527. X
  528. (setq math-cache-list nil)
  529. X
  530. X
  531. X
  532. X
  533. (defun calc-var-value (v)
  534. X  (and (symbolp v)
  535. X       (boundp v)
  536. X       (symbol-value v)
  537. X       (if (symbolp (symbol-value v))
  538. X       (set v (funcall (symbol-value v)))
  539. X     (if (stringp (symbol-value v))
  540. X         (let ((val (math-read-expr (symbol-value v))))
  541. X           (if (eq (car-safe val) 'error)
  542. X           (error "Bad format in variable contents: %s" (nth 2 val))
  543. X         (set v val)))
  544. X       (symbol-value v))))
  545. )
  546. X
  547. X
  548. X
  549. X
  550. X
  551. ;;; In the following table, ( OP LOPS ROPS ) means that if an OP
  552. ;;; term appears as the first argument to any LOPS term, or as the
  553. ;;; second argument to any ROPS term, then they should be treated
  554. ;;; as one large term for purposes of associative selection.
  555. (defconst calc-assoc-ops '( ( + ( + - ) ( + ) )
  556. X                ( - ( + - ) ( + ) )
  557. X                ( * ( * )   ( * ) )
  558. X                ( / ( / )   (   ) )
  559. X                ( | ( | )   ( | ) )
  560. X                ( calcFunc-land ( calcFunc-land ) 
  561. X                        ( calcFunc-land ) )
  562. X                ( calcFunc-lor ( calcFunc-lor ) 
  563. X                       ( calcFunc-lor ) ) ))
  564. X
  565. X
  566. (defvar var-CommuteRules 'calc-CommuteRules)
  567. (defvar var-JumpRules    'calc-JumpRules)
  568. (defvar var-DistribRules 'calc-DistribRules)
  569. (defvar var-MergeRules   'calc-MergeRules)
  570. (defvar var-NegateRules  'calc-NegateRules)
  571. (defvar var-InvertRules  'calc-InvertRules)
  572. X
  573. X
  574. (defconst calc-tweak-eqn-table '( ( calcFunc-eq  calcFunc-eq  calcFunc-neq )
  575. X                  ( calcFunc-neq calcFunc-neq calcFunc-eq  )
  576. X                  ( calcFunc-lt  calcFunc-gt  calcFunc-geq )
  577. X                  ( calcFunc-gt  calcFunc-lt  calcFunc-leq )
  578. X                  ( calcFunc-leq calcFunc-geq calcFunc-gt  )
  579. X                  ( calcFunc-geq calcFunc-leq calcFunc-lt  ) ))
  580. X
  581. X
  582. X
  583. X
  584. (defun calc-float (arg)
  585. X  (interactive "P")
  586. X  (calc-slow-wrapper
  587. X   (calc-unary-op "flt"
  588. X          (if (calc-is-hyperbolic) 'calcFunc-float 'calcFunc-pfloat)
  589. X          arg))
  590. )
  591. X
  592. X
  593. (defvar calc-gnuplot-process nil)
  594. X
  595. X
  596. (defun calc-gnuplot-alive ()
  597. X  (and calc-gnuplot-process
  598. X       calc-gnuplot-buffer
  599. X       (buffer-name calc-gnuplot-buffer)
  600. X       calc-gnuplot-input
  601. X       (buffer-name calc-gnuplot-input)
  602. X       (memq (process-status calc-gnuplot-process) '(run stop)))
  603. )
  604. X
  605. X
  606. X
  607. X
  608. X
  609. (defun calc-load-everything ()
  610. X  (interactive)
  611. X  (calc-need-macros)       ; calc-macs.el
  612. X  (calc-record-list nil)   ; calc-misc.el
  613. X  (math-read-exprs "0")    ; calc-aent.el
  614. X
  615. ;;;; (Loads here)
  616. X  (calc-Need-calc-alg-2)
  617. X  (calc-Need-calc-alg-3)
  618. X  (calc-Need-calc-alg)
  619. X  (calc-Need-calc-arith)
  620. X  (calc-Need-calc-bin)
  621. X  (calc-Need-calc-comb)
  622. X  (calc-Need-calc-comp)
  623. X  (calc-Need-calc-cplx)
  624. X  (calc-Need-calc-embed)
  625. X  (calc-Need-calc-fin)
  626. X  (calc-Need-calc-forms)
  627. X  (calc-Need-calc-frac)
  628. X  (calc-Need-calc-funcs)
  629. X  (calc-Need-calc-graph)
  630. X  (calc-Need-calc-help)
  631. X  (calc-Need-calc-incom)
  632. X  (calc-Need-calc-keypd)
  633. X  (calc-Need-calc-lang)
  634. X  (calc-Need-calc-map)
  635. X  (calc-Need-calc-mat)
  636. X  (calc-Need-calc-math)
  637. X  (calc-Need-calc-mode)
  638. X  (calc-Need-calc-poly)
  639. X  (calc-Need-calc-prog)
  640. X  (calc-Need-calc-rewr)
  641. X  (calc-Need-calc-rules)
  642. X  (calc-Need-calc-sel-2)
  643. X  (calc-Need-calc-sel)
  644. X  (calc-Need-calc-stat)
  645. X  (calc-Need-calc-store)
  646. X  (calc-Need-calc-stuff)
  647. X  (calc-Need-calc-trail)
  648. X  (calc-Need-calc-undo)
  649. X  (calc-Need-calc-units)
  650. X  (calc-Need-calc-vec)
  651. X  (calc-Need-calc-yank)
  652. X
  653. X  (message "All parts of Calc are now loaded.")
  654. )
  655. X
  656. X
  657. ;;; Vector commands.
  658. X
  659. (defun calc-concat (arg)
  660. X  (interactive "P")
  661. X  (calc-wrapper
  662. X   (if (calc-is-inverse)
  663. X       (if (calc-is-hyperbolic)
  664. X       (calc-enter-result 2 "apnd" (list 'calcFunc-append
  665. X                      (calc-top 1) (calc-top 2)))
  666. X     (calc-enter-result 2 "|" (list 'calcFunc-vconcat
  667. X                    (calc-top 1) (calc-top 2))))
  668. X     (if (calc-is-hyperbolic)
  669. X     (calc-binary-op "apnd" 'calcFunc-append arg '(vec))
  670. X       (calc-binary-op "|" 'calcFunc-vconcat arg '(vec) nil '|))))
  671. )
  672. X
  673. (defun calc-append (arg)
  674. X  (interactive "P")
  675. X  (calc-hyperbolic-func)
  676. X  (calc-concat arg)
  677. )
  678. X
  679. X
  680. (defconst calc-arg-values '( ( var ArgA var-ArgA ) ( var ArgB var-ArgB )
  681. X                 ( var ArgC var-ArgC ) ( var ArgD var-ArgD )
  682. X                 ( var ArgE var-ArgE ) ( var ArgF var-ArgF )
  683. X                 ( var ArgG var-ArgG ) ( var ArgH var-ArgH )
  684. X                 ( var ArgI var-ArgI ) ( var ArgJ var-ArgJ )
  685. ))
  686. X
  687. (defun calc-invent-args (n)
  688. X  (nreverse (nthcdr (- (length calc-arg-values) n) (reverse calc-arg-values)))
  689. )
  690. X
  691. X
  692. X
  693. X
  694. ;;; User menu.
  695. X
  696. (defun calc-user-key-map ()
  697. X  (let ((res (cdr (elt calc-mode-map ?z))))
  698. X    (if (eq (car (car res)) 27)
  699. X    (cdr res)
  700. X      res))
  701. )
  702. X
  703. (defun calc-z-prefix-help ()
  704. X  (interactive)
  705. X  (let* ((msgs nil)
  706. X     (buf "")
  707. X     (kmap (sort (copy-sequence (calc-user-key-map))
  708. X             (function (lambda (x y) (< (car x) (car y))))))
  709. X     (flags (apply 'logior
  710. X               (mapcar (function
  711. X                (lambda (k)
  712. X                  (calc-user-function-classify (car k))))
  713. X                   kmap))))
  714. X    (if (= (logand flags 8) 0)
  715. X    (calc-user-function-list kmap 7)
  716. X      (calc-user-function-list kmap 1)
  717. X      (setq msgs (cons buf msgs)
  718. X        buf "")
  719. X      (calc-user-function-list kmap 6))
  720. X    (if (/= flags 0)
  721. X    (setq msgs (cons buf msgs)))
  722. X    (calc-do-prefix-help (nreverse msgs) "user" ?z))
  723. )
  724. X
  725. (defun calc-user-function-classify (key)
  726. X  (cond ((/= key (downcase key))    ; upper-case
  727. X     (if (assq (downcase key) (calc-user-key-map)) 9 1))
  728. X    ((/= key (upcase key)) 2)   ; lower-case
  729. X    ((= key ??) 0)
  730. X    (t 4))   ; other
  731. )
  732. X
  733. (defun calc-user-function-list (map flags)
  734. X  (and map
  735. X       (let* ((key (car (car map)))
  736. X          (kind (calc-user-function-classify key))
  737. X          (func (cdr (car map))))
  738. X     (if (or (= (logand kind flags) 0)
  739. X         (not (symbolp func)))
  740. X         ()
  741. X       (let* ((name (symbol-name func))
  742. X          (name (if (string-match "\\`calc-" name)
  743. X                (substring name 5) name))
  744. X          (pos (string-match (char-to-string key) name))
  745. X          (desc
  746. X           (if (symbolp func)
  747. X               (if (= (logand kind 3) 0)
  748. X               (format "`%c' = %s" key name)
  749. X             (if pos
  750. X                 (format "%s%c%s"
  751. X                     (downcase (substring name 0 pos))
  752. X                     (upcase key)
  753. X                     (downcase (substring name (1+ pos))))
  754. X               (format "%c = %s"
  755. X                   (upcase key)
  756. X                   (downcase name))))
  757. X             (char-to-string (upcase key)))))
  758. X         (if (= (length buf) 0)
  759. X         (setq buf (concat (if (= flags 1) "SHIFT + " "")
  760. X                   desc))
  761. X           (if (> (+ (length buf) (length desc)) 58)
  762. X           (setq msgs (cons buf msgs)
  763. X             buf (concat (if (= flags 1) "SHIFT + " "")
  764. X                     desc))
  765. X         (setq buf (concat buf ", " desc))))))
  766. X     (calc-user-function-list (cdr map) flags)))
  767. )
  768. X
  769. X
  770. X
  771. (defun calc-shift-Z-prefix-help ()
  772. X  (interactive)
  773. X  (calc-do-prefix-help
  774. X   '("Define, Undefine, Formula, Kbd-macro, Edit, Get-defn"
  775. X     "Composition; Invocation; Permanent; Timing"
  776. X     "kbd-macros: [ (if), : (else), | (else-if), ] (end-if)"
  777. X     "kbd-macros: < > (repeat), ( ) (for), { } (loop)"
  778. X     "kbd-macros: / (break)"
  779. X     "kbd-macros: ` (save), ' (restore)")
  780. X   "user" ?Z)
  781. )
  782. X
  783. X
  784. ;;;; Caches.
  785. X
  786. (defmacro math-defcache (name init form)
  787. X  (let ((cache-prec (intern (concat (symbol-name name) "-cache-prec")))
  788. X    (cache-val (intern (concat (symbol-name name) "-cache")))
  789. X    (last-prec (intern (concat (symbol-name name) "-last-prec")))
  790. X    (last-val (intern (concat (symbol-name name) "-last"))))
  791. X    (list 'progn
  792. X      (list 'setq cache-prec (if init (math-numdigs (nth 1 init)) -100))
  793. X      (list 'setq cache-val (list 'quote init))
  794. X      (list 'setq last-prec -100)
  795. X      (list 'setq last-val nil)
  796. X      (list 'setq 'math-cache-list
  797. X        (list 'cons
  798. X              (list 'quote cache-prec)
  799. X              (list 'cons
  800. X                (list 'quote last-prec)
  801. X                'math-cache-list)))
  802. X      (list 'defun
  803. X        name ()
  804. X        (list 'or
  805. X              (list '= last-prec 'calc-internal-prec)
  806. X              (list 'setq
  807. X                last-val
  808. X                (list 'math-normalize
  809. X                  (list 'progn
  810. X                    (list 'or
  811. X                          (list '>= cache-prec
  812. X                            'calc-internal-prec)
  813. X                          (list 'setq
  814. X                            cache-val
  815. X                            (list 'let
  816. X                              '((calc-internal-prec
  817. X                                 (+ calc-internal-prec
  818. X                                4)))
  819. X                              form)
  820. X                            cache-prec
  821. X                            '(+ calc-internal-prec 2)))
  822. X                    cache-val))
  823. X                last-prec 'calc-internal-prec))
  824. X        last-val)))
  825. )
  826. (put 'math-defcache 'lisp-indent-hook 2)
  827. X
  828. ;;; Betcha didn't know that pi = 16 atan(1/5) - 4 atan(1/239).   [F] [Public]
  829. (math-defcache math-pi (float (bigpos 463 238 793 589 653 592 141 3) -21)
  830. X  (math-add-float (math-mul-float '(float 16 0)
  831. X                  (math-arctan-raw '(float 2 -1)))
  832. X          (math-mul-float '(float -4 0)
  833. X                  (math-arctan-raw
  834. X                   (math-float '(frac 1 239))))))
  835. X
  836. (math-defcache math-two-pi nil
  837. X  (math-mul-float (math-pi) '(float 2 0)))
  838. X
  839. (math-defcache math-pi-over-2 nil
  840. X  (math-mul-float (math-pi) '(float 5 -1)))
  841. X
  842. (math-defcache math-pi-over-4 nil
  843. X  (math-mul-float (math-pi) '(float 25 -2)))
  844. X
  845. (math-defcache math-pi-over-180 nil
  846. X  (math-div-float (math-pi) '(float 18 1)))
  847. X
  848. (math-defcache math-sqrt-pi nil
  849. X  (math-sqrt-float (math-pi)))
  850. X
  851. (math-defcache math-sqrt-2 nil
  852. X  (math-sqrt-float '(float 2 0)))
  853. X
  854. (math-defcache math-sqrt-12 nil
  855. X  (math-sqrt-float '(float 12 0)))
  856. X
  857. (math-defcache math-sqrt-two-pi nil
  858. X  (math-sqrt-float (math-two-pi)))
  859. X
  860. (math-defcache math-sqrt-e (float (bigpos 849 146 128 700 270 721 648 1) -21)
  861. X  (math-add-float '(float 1 0) (math-exp-minus-1-raw '(float 5 -1))))
  862. X
  863. (math-defcache math-e nil
  864. X  (math-pow (math-sqrt-e) 2))
  865. X
  866. (math-defcache math-phi nil
  867. X  (math-mul-float (math-add-float (math-sqrt-raw '(float 5 0)) '(float 1 0))
  868. X          '(float 5 -1)))
  869. X
  870. (math-defcache math-gamma-const nil
  871. X  '(float (bigpos 495 467 917 632 470 369 709 646 776 267 677 848 348 672
  872. X          057 988 235 399 359 593 421 310 024 824 900 120 065 606
  873. X          328 015 649 156 772 5) -100))
  874. X
  875. (defun math-half-circle (symb)
  876. X  (if (eq calc-angle-mode 'rad)
  877. X      (if symb
  878. X      '(var pi var-pi)
  879. X    (math-pi))
  880. X    180)
  881. )
  882. X
  883. (defun math-full-circle (symb)
  884. X  (math-mul 2 (math-half-circle symb))
  885. )
  886. X
  887. (defun math-quarter-circle (symb)
  888. X  (math-div (math-half-circle symb) 2)
  889. )
  890. X
  891. X
  892. X
  893. X
  894. ;;;; Miscellaneous math routines.
  895. X
  896. ;;; True if A is an odd integer.  [P R R] [Public]
  897. (defun math-oddp (a)
  898. X  (if (consp a)
  899. X      (and (memq (car a) '(bigpos bigneg))
  900. X       (= (% (nth 1 a) 2) 1))
  901. X    (/= (% a 2) 0))
  902. )
  903. X
  904. ;;; True if A is a small or big integer.  [P x] [Public]
  905. (defun math-integerp (a)
  906. X  (or (integerp a)
  907. X      (memq (car-safe a) '(bigpos bigneg)))
  908. )
  909. X
  910. ;;; True if A is (numerically) a non-negative integer.  [P N] [Public]
  911. (defun math-natnump (a)
  912. X  (or (natnump a)
  913. X      (eq (car-safe a) 'bigpos))
  914. )
  915. X
  916. ;;; True if A is a rational (or integer).  [P x] [Public]
  917. (defun math-ratp (a)
  918. X  (or (integerp a)
  919. X      (memq (car-safe a) '(bigpos bigneg frac)))
  920. )
  921. X
  922. ;;; True if A is a real (or rational).  [P x] [Public]
  923. (defun math-realp (a)
  924. X  (or (integerp a)
  925. X      (memq (car-safe a) '(bigpos bigneg frac float)))
  926. )
  927. X
  928. ;;; True if A is a real or HMS form.  [P x] [Public]
  929. (defun math-anglep (a)
  930. X  (or (integerp a)
  931. X      (memq (car-safe a) '(bigpos bigneg frac float hms)))
  932. )
  933. X
  934. ;;; True if A is a number of any kind.  [P x] [Public]
  935. (defun math-numberp (a)
  936. X  (or (integerp a)
  937. X      (memq (car-safe a) '(bigpos bigneg frac float cplx polar)))
  938. )
  939. X
  940. ;;; True if A is a complex number or angle.  [P x] [Public]
  941. (defun math-scalarp (a)
  942. X  (or (integerp a)
  943. X      (memq (car-safe a) '(bigpos bigneg frac float cplx polar hms)))
  944. )
  945. X
  946. ;;; True if A is a vector.  [P x] [Public]
  947. (defun math-vectorp (a)
  948. X  (eq (car-safe a) 'vec)
  949. )
  950. X
  951. ;;; True if A is any vector or scalar data object.  [P x]
  952. (defun math-objvecp (a)    ;  [Public]
  953. X  (or (integerp a)
  954. X      (memq (car-safe a) '(bigpos bigneg frac float cplx polar
  955. X                  hms date sdev intv mod vec incomplete)))
  956. )
  957. X
  958. ;;; True if A is an object not composed of sub-formulas .  [P x] [Public]
  959. (defun math-primp (a)
  960. X  (or (integerp a)
  961. X      (memq (car-safe a) '(bigpos bigneg frac float cplx polar
  962. X                  hms date mod var)))
  963. )
  964. X
  965. ;;; True if A is numerically (but not literally) an integer.  [P x] [Public]
  966. (defun math-messy-integerp (a)
  967. X  (cond
  968. X   ((eq (car-safe a) 'float) (>= (nth 2 a) 0))
  969. X   ((eq (car-safe a) 'frac) (Math-integerp (math-normalize a))))
  970. )
  971. X
  972. ;;; True if A is numerically an integer.  [P x] [Public]
  973. (defun math-num-integerp (a)
  974. X  (or (Math-integerp a)
  975. X      (Math-messy-integerp a))
  976. )
  977. X
  978. ;;; True if A is (numerically) a non-negative integer.  [P N] [Public]
  979. (defun math-num-natnump (a)
  980. X  (or (natnump a)
  981. X      (eq (car-safe a) 'bigpos)
  982. X      (and (eq (car-safe a) 'float)
  983. X       (Math-natnump (nth 1 a))
  984. X       (>= (nth 2 a) 0)))
  985. )
  986. X
  987. ;;; True if A is an integer or will evaluate to an integer.  [P x] [Public]
  988. (defun math-provably-integerp (a)
  989. X  (or (Math-integerp a)
  990. X      (and (memq (car-safe a) '(calcFunc-trunc
  991. X                calcFunc-round
  992. X                calcFunc-rounde
  993. X                calcFunc-roundu
  994. X                calcFunc-floor
  995. X                calcFunc-ceil))
  996. X       (= (length a) 2)))
  997. )
  998. X
  999. ;;; True if A is a real or will evaluate to a real.  [P x] [Public]
  1000. (defun math-provably-realp (a)
  1001. X  (or (Math-realp a)
  1002. X      (math-provably-integer a)
  1003. X      (memq (car-safe a) '(abs arg)))
  1004. )
  1005. X
  1006. ;;; True if A is a non-real, complex number.  [P x] [Public]
  1007. (defun math-complexp (a)
  1008. X  (memq (car-safe a) '(cplx polar))
  1009. )
  1010. X
  1011. ;;; True if A is a non-real, rectangular complex number.  [P x] [Public]
  1012. (defun math-rect-complexp (a)
  1013. X  (eq (car-safe a) 'cplx)
  1014. )
  1015. X
  1016. ;;; True if A is a non-real, polar complex number.  [P x] [Public]
  1017. (defun math-polar-complexp (a)
  1018. X  (eq (car-safe a) 'polar)
  1019. )
  1020. X
  1021. ;;; True if A is a matrix.  [P x] [Public]
  1022. (defun math-matrixp (a)
  1023. X  (and (Math-vectorp a)
  1024. X       (Math-vectorp (nth 1 a))
  1025. X       (cdr (nth 1 a))
  1026. X       (math-matrixp-step (cdr (cdr a)) (length (nth 1 a))))
  1027. )
  1028. X
  1029. (defun math-matrixp-step (a len)   ; [P L]
  1030. X  (or (null a)
  1031. X      (and (Math-vectorp (car a))
  1032. X       (= (length (car a)) len)
  1033. X       (math-matrixp-step (cdr a) len)))
  1034. )
  1035. X
  1036. ;;; True if A is a square matrix.  [P V] [Public]
  1037. (defun math-square-matrixp (a)
  1038. X  (let ((dims (math-mat-dimens a)))
  1039. X    (and (cdr dims)
  1040. X     (= (car dims) (nth 1 dims))))
  1041. )
  1042. X
  1043. ;;; True if A is any scalar data object.  [P x]
  1044. (defun math-objectp (a)    ;  [Public]
  1045. X  (or (integerp a)
  1046. X      (memq (car-safe a) '(bigpos bigneg frac float cplx
  1047. X                  polar hms date sdev intv mod)))
  1048. )
  1049. X
  1050. ;;; Verify that A is an integer and return A in integer form.  [I N; - x]
  1051. (defun math-check-integer (a)   ;  [Public]
  1052. X  (cond ((integerp a) a)  ; for speed
  1053. X    ((math-integerp a) a)
  1054. X    ((math-messy-integerp a)
  1055. X     (math-trunc a))
  1056. X    (t (math-reject-arg a 'integerp)))
  1057. )
  1058. X
  1059. ;;; Verify that A is a small integer and return A in integer form.  [S N; - x]
  1060. (defun math-check-fixnum (a &optional allow-inf)   ;  [Public]
  1061. X  (cond ((integerp a) a)  ; for speed
  1062. X    ((Math-num-integerp a)
  1063. X     (let ((a (math-trunc a)))
  1064. X       (if (integerp a)
  1065. X           a
  1066. X         (if (or (Math-lessp (lsh -1 -1) a)
  1067. X             (Math-lessp a (- (lsh -1 -1))))
  1068. X         (math-reject-arg a 'fixnump)
  1069. X           (math-fixnum a)))))
  1070. X    ((and allow-inf (equal a '(var inf var-inf)))
  1071. X     (lsh -1 -1))
  1072. X    ((and allow-inf (equal a '(neg (var inf var-inf))))
  1073. X     (- (lsh -1 -1)))
  1074. X    (t (math-reject-arg a 'fixnump)))
  1075. )
  1076. X
  1077. ;;; Verify that A is an integer >= 0 and return A in integer form.  [I N; - x]
  1078. (defun math-check-natnum (a)    ;  [Public]
  1079. X  (cond ((natnump a) a)
  1080. X    ((and (not (math-negp a))
  1081. X          (Math-num-integerp a))
  1082. X     (math-trunc a))
  1083. X    (t (math-reject-arg a 'natnump)))
  1084. )
  1085. X
  1086. ;;; Verify that A is in floating-point form, or force it to be a float.  [F N]
  1087. (defun math-check-float (a)    ; [Public]
  1088. X  (cond ((eq (car-safe a) 'float) a)
  1089. X    ((Math-vectorp a) (math-map-vec 'math-check-float a))
  1090. X    ((Math-objectp a) (math-float a))
  1091. X    (t a))
  1092. )
  1093. X
  1094. ;;; Verify that A is a constant.
  1095. (defun math-check-const (a &optional exp-ok)
  1096. X  (if (or (math-constp a)
  1097. X      (and exp-ok math-expand-formulas))
  1098. X      a
  1099. X    (math-reject-arg a 'constp))
  1100. )
  1101. X
  1102. X
  1103. ;;; Coerce integer A to be a small integer.  [S I]
  1104. (defun math-fixnum (a)
  1105. X  (if (consp a)
  1106. X      (if (cdr a)
  1107. X      (if (eq (car a) 'bigneg)
  1108. X          (- (math-fixnum-big (cdr a)))
  1109. X        (math-fixnum-big (cdr a)))
  1110. X    0)
  1111. X    a)
  1112. )
  1113. X
  1114. (defun math-fixnum-big (a)
  1115. X  (if (cdr a)
  1116. X      (+ (car a) (* (math-fixnum-big (cdr a)) 1000))
  1117. X    (car a))
  1118. )
  1119. X
  1120. X
  1121. (defun math-normalize-fancy (a)
  1122. X  (cond ((eq (car a) 'frac)
  1123. X     (math-make-frac (math-normalize (nth 1 a))
  1124. X             (math-normalize (nth 2 a))))
  1125. X    ((eq (car a) 'cplx)
  1126. X     (let ((real (math-normalize (nth 1 a)))
  1127. X           (imag (math-normalize (nth 2 a))))
  1128. X       (if (and (math-zerop imag)
  1129. X            (not math-simplify-only))   ; oh, what a kludge!
  1130. X           real
  1131. X         (list 'cplx real imag))))
  1132. X    ((eq (car a) 'polar)
  1133. X     (math-normalize-polar a))
  1134. X    ((eq (car a) 'hms)
  1135. X     (math-normalize-hms a))
  1136. X    ((eq (car a) 'date)
  1137. X     (list 'date (math-normalize (nth 1 a))))
  1138. X    ((eq (car a) 'mod)
  1139. X     (math-normalize-mod a))
  1140. X    ((eq (car a) 'sdev)
  1141. X     (let ((x (math-normalize (nth 1 a)))
  1142. X           (s (math-normalize (nth 2 a))))
  1143. X       (if (or (and (Math-objectp x) (not (Math-scalarp x)))
  1144. X           (and (Math-objectp s) (not (Math-scalarp s))))
  1145. X           (list 'calcFunc-sdev x s)
  1146. X         (math-make-sdev x s))))
  1147. X    ((eq (car a) 'intv)
  1148. X     (let ((mask (math-normalize (nth 1 a)))
  1149. X           (lo (math-normalize (nth 2 a)))
  1150. X           (hi (math-normalize (nth 3 a))))
  1151. X       (if (if (eq (car-safe lo) 'date)
  1152. X           (not (eq (car-safe hi) 'date))
  1153. X         (or (and (Math-objectp lo) (not (Math-anglep lo)))
  1154. X             (and (Math-objectp hi) (not (Math-anglep hi)))))
  1155. X           (list 'calcFunc-intv mask lo hi)
  1156. X         (math-make-intv mask lo hi))))
  1157. X    ((eq (car a) 'vec)
  1158. X     (cons 'vec (mapcar 'math-normalize (cdr a))))
  1159. X    ((eq (car a) 'quote)
  1160. X     (math-normalize (nth 1 a)))
  1161. X    ((eq (car a) 'special-const)
  1162. X     (calc-with-default-simplification
  1163. X      (math-normalize (nth 1 a))))
  1164. X    ((eq (car a) 'var)
  1165. X     (cons 'var (cdr a)))   ; need to re-cons for selection routines
  1166. X    ((eq (car a) 'calcFunc-if)
  1167. X     (math-normalize-logical-op a))
  1168. X    ((memq (car a) '(calcFunc-lambda calcFunc-quote calcFunc-condition))
  1169. X     (let ((calc-simplify-mode 'none))
  1170. X       (cons (car a) (mapcar 'math-normalize (cdr a)))))
  1171. X    ((eq (car a) 'calcFunc-evalto)
  1172. X     (setq a (or (nth 1 a) 0))
  1173. X     (or calc-refreshing-evaltos
  1174. X         (setq a (let ((calc-simplify-mode 'none)) (math-normalize a))))
  1175. X     (let ((b (if (and (eq (car-safe a) 'calcFunc-assign)
  1176. X               (= (length a) 3))
  1177. X              (nth 2 a)
  1178. X            a)))
  1179. X       (list 'calcFunc-evalto
  1180. X         a
  1181. X         (if (eq calc-simplify-mode 'none)
  1182. X             (math-normalize b)
  1183. X           (calc-with-default-simplification
  1184. X            (math-evaluate-expr b))))))
  1185. X    ((or (integerp (car a)) (consp (car a)))
  1186. X     (if (null (cdr a))
  1187. X         (math-normalize (car a))
  1188. X       (error "Can't use multi-valued function in an expression"))))
  1189. )
  1190. X
  1191. (defun math-normalize-nonstandard ()   ; uses "a"
  1192. X  (if (consp calc-simplify-mode)
  1193. X      (progn
  1194. X    (setq calc-simplify-mode 'none
  1195. X          math-simplify-only (car-safe (cdr-safe a)))
  1196. X    nil)
  1197. X    (and (symbolp (car a))
  1198. X     (or (eq calc-simplify-mode 'none)
  1199. X         (and (eq calc-simplify-mode 'num)
  1200. X          (let ((aptr (setq a (cons
  1201. X                       (car a)
  1202. X                       (mapcar 'math-normalize (cdr a))))))
  1203. X            (while (and aptr (math-constp (car aptr)))
  1204. X              (setq aptr (cdr aptr)))
  1205. X            aptr)))
  1206. X     (cons (car a) (mapcar 'math-normalize (cdr a)))))
  1207. )
  1208. X
  1209. X
  1210. X
  1211. (setq math-expand-formulas nil)
  1212. X
  1213. X
  1214. ;;; Normalize a bignum digit list by trimming high-end zeros.  [L l]
  1215. (defun math-norm-bignum (a)
  1216. X  (let ((digs a) (last nil))
  1217. X    (while digs
  1218. X      (or (eq (car digs) 0) (setq last digs))
  1219. X      (setq digs (cdr digs)))
  1220. X    (and last
  1221. X     (progn
  1222. X       (setcdr last nil)
  1223. X       a)))
  1224. )
  1225. X
  1226. (defun math-bignum-test (a)   ; [B N; B s; b b]
  1227. X  (if (consp a)
  1228. X      a
  1229. X    (math-bignum a))
  1230. )
  1231. X
  1232. X
  1233. ;;; Return 0 for zero, -1 for negative, 1 for positive.  [S n] [Public]
  1234. (defun calcFunc-sign (a &optional x)
  1235. X  (let ((signs (math-possible-signs a)))
  1236. X    (cond ((eq signs 4) (or x 1))
  1237. X      ((eq signs 2) 0)
  1238. X      ((eq signs 1) (if x (math-neg x) -1))
  1239. X      ((math-looks-negp a) (math-neg (calcFunc-sign (math-neg a))))
  1240. X      (t (calc-record-why 'realp a)
  1241. X         (if x
  1242. X         (list 'calcFunc-sign a x)
  1243. X           (list 'calcFunc-sign a)))))
  1244. )
  1245. X
  1246. ;;; Return 0 if A is numerically equal to B, <0 if less, >0 if more.
  1247. ;;; Arguments must be normalized!  [S N N]
  1248. (defun math-compare (a b)
  1249. X  (cond ((equal a b)
  1250. X     (if (and (consp a)
  1251. X          (memq (car a) '(var neg * /))
  1252. X          (math-infinitep a))
  1253. X         2
  1254. X       0))
  1255. X    ((and (integerp a) (Math-integerp b))
  1256. X     (if (consp b)
  1257. X         (if (eq (car b) 'bigpos) -1 1)
  1258. X       (if (< a b) -1 1)))
  1259. X    ((and (eq (car-safe a) 'bigpos) (Math-integerp b))
  1260. X     (if (eq (car-safe b) 'bigpos)
  1261. X         (math-compare-bignum (cdr a) (cdr b))
  1262. X       1))
  1263. X    ((and (eq (car-safe a) 'bigneg) (Math-integerp b))
  1264. X     (if (eq (car-safe b) 'bigneg)
  1265. X         (math-compare-bignum (cdr b) (cdr a))
  1266. X       -1))
  1267. X    ((eq (car-safe a) 'frac)
  1268. X     (if (eq (car-safe b) 'frac)
  1269. X         (math-compare (math-mul (nth 1 a) (nth 2 b))
  1270. X               (math-mul (nth 1 b) (nth 2 a)))
  1271. X       (math-compare (nth 1 a) (math-mul b (nth 2 a)))))
  1272. X    ((eq (car-safe b) 'frac)
  1273. X     (math-compare (math-mul a (nth 2 b)) (nth 1 b)))
  1274. X    ((and (eq (car-safe a) 'float) (eq (car-safe b) 'float))
  1275. X     (if (math-lessp-float a b) -1 1))
  1276. X    ((and (eq (car-safe a) 'date) (eq (car-safe b) 'date))
  1277. X     (math-compare (nth 1 a) (nth 1 b)))
  1278. X    ((and (or (Math-anglep a)
  1279. X          (and (eq (car a) 'cplx) (eq (nth 2 a) 0)))
  1280. X          (or (Math-anglep b)
  1281. X          (and (eq (car b) 'cplx) (eq (nth 2 b) 0))))
  1282. X     (calcFunc-sign (math-add a (math-neg b))))
  1283. X    ((and (eq (car-safe a) 'intv)
  1284. X          (or (Math-anglep b) (eq (car-safe b) 'date)))
  1285. X     (let ((res (math-compare (nth 2 a) b)))
  1286. X       (cond ((eq res 1) 1)
  1287. X         ((and (eq res 0) (memq (nth 1 a) '(0 1))) 1)
  1288. X         ((eq (setq res (math-compare (nth 3 a) b)) -1) -1)
  1289. X         ((and (eq res 0) (memq (nth 1 a) '(0 2))) -1)
  1290. X         (t 2))))
  1291. X    ((and (eq (car-safe b) 'intv)
  1292. X          (or (Math-anglep a) (eq (car-safe a) 'date)))
  1293. X     (let ((res (math-compare a (nth 2 b))))
  1294. X       (cond ((eq res -1) -1)
  1295. X         ((and (eq res 0) (memq (nth 1 b) '(0 1))) -1)
  1296. X         ((eq (setq res (math-compare a (nth 3 b))) 1) 1)
  1297. X         ((and (eq res 0) (memq (nth 1 b) '(0 2))) 1)
  1298. X         (t 2))))
  1299. X    ((and (eq (car-safe a) 'intv) (eq (car-safe b) 'intv))
  1300. X     (let ((res (math-compare (nth 3 a) (nth 2 b))))
  1301. X       (cond ((eq res -1) -1)
  1302. X         ((and (eq res 0) (or (memq (nth 1 a) '(0 2))
  1303. X                      (memq (nth 1 b) '(0 1)))) -1)
  1304. X         ((eq (setq res (math-compare (nth 2 a) (nth 3 b))) 1) 1)
  1305. X         ((and (eq res 0) (or (memq (nth 1 a) '(0 1))
  1306. X                      (memq (nth 1 b) '(0 2)))) 1)
  1307. X         (t 2))))
  1308. X    ((math-infinitep a)
  1309. X     (if (or (equal a '(var uinf var-uinf))
  1310. X         (equal a '(var nan var-nan)))
  1311. X         2
  1312. X       (let ((dira (math-infinite-dir a)))
  1313. X         (if (math-infinitep b)
  1314. X         (if (or (equal b '(var uinf var-uinf))
  1315. X             (equal b '(var nan var-nan)))
  1316. X             2
  1317. X           (let ((dirb (math-infinite-dir b)))
  1318. X             (cond ((and (eq dira 1) (eq dirb -1)) 1)
  1319. X               ((and (eq dira -1) (eq dirb 1)) -1)
  1320. X               (t 2))))
  1321. X           (cond ((eq dira 1) 1)
  1322. X             ((eq dira -1) -1)
  1323. X             (t 2))))))
  1324. X    ((math-infinitep b)
  1325. X     (if (or (equal b '(var uinf var-uinf))
  1326. X         (equal b '(var nan var-nan)))
  1327. X         2
  1328. X       (let ((dirb (math-infinite-dir b)))
  1329. X         (cond ((eq dirb 1) -1)
  1330. X           ((eq dirb -1) 1)
  1331. X           (t 2)))))
  1332. X    ((and (eq (car-safe a) 'calcFunc-exp)
  1333. X          (eq (car-safe b) '^)
  1334. X          (equal (nth 1 b) '(var e var-e)))
  1335. X     (math-compare (nth 1 a) (nth 2 b)))
  1336. X    ((and (eq (car-safe b) 'calcFunc-exp)
  1337. X          (eq (car-safe a) '^)
  1338. X          (equal (nth 1 a) '(var e var-e)))
  1339. X     (math-compare (nth 2 a) (nth 1 b)))
  1340. X    ((or (and (eq (car-safe a) 'calcFunc-sqrt)
  1341. X          (eq (car-safe b) '^)
  1342. X          (or (equal (nth 2 b) '(frac 1 2))
  1343. X              (equal (nth 2 b) '(float 5 -1))))
  1344. X         (and (eq (car-safe b) 'calcFunc-sqrt)
  1345. X          (eq (car-safe a) '^)
  1346. X          (or (equal (nth 2 a) '(frac 1 2))
  1347. X              (equal (nth 2 a) '(float 5 -1)))))
  1348. X     (math-compare (nth 1 a) (nth 1 b)))
  1349. X    ((eq (car-safe a) 'var)
  1350. X     2)
  1351. X    (t
  1352. X     (if (and (consp a) (consp b)
  1353. X          (eq (car a) (car b))
  1354. X          (math-compare-lists (cdr a) (cdr b)))
  1355. X         0
  1356. X       2)))
  1357. )
  1358. X
  1359. ;;; Compare two bignum digit lists, return -1 for A<B, 0 for A=B, 1 for A>B.
  1360. (defun math-compare-bignum (a b)   ; [S l l]
  1361. X  (let ((res 0))
  1362. X    (while (and a b)
  1363. X      (if (< (car a) (car b))
  1364. X      (setq res -1)
  1365. X    (if (> (car a) (car b))
  1366. X        (setq res 1)))
  1367. X      (setq a (cdr a)
  1368. X        b (cdr b)))
  1369. X    (if a
  1370. X    (progn
  1371. X      (while (eq (car a) 0) (setq a (cdr a)))
  1372. X      (if a 1 res))
  1373. X      (while (eq (car b) 0) (setq b (cdr b)))
  1374. X      (if b -1 res)))
  1375. )
  1376. X
  1377. (defun math-compare-lists (a b)
  1378. X  (cond ((null a) (null b))
  1379. X    ((null b) nil)
  1380. X    (t (and (Math-equal (car a) (car b))
  1381. X        (math-compare-lists (cdr a) (cdr b)))))
  1382. )
  1383. X
  1384. (defun math-lessp-float (a b)   ; [P F F]
  1385. X  (let ((ediff (- (nth 2 a) (nth 2 b))))
  1386. X    (if (>= ediff 0)
  1387. X    (if (>= ediff (+ calc-internal-prec calc-internal-prec))
  1388. X        (if (eq (nth 1 a) 0)
  1389. X        (Math-integer-posp (nth 1 b))
  1390. X          (Math-integer-negp (nth 1 a)))
  1391. X      (Math-lessp (math-scale-int (nth 1 a) ediff)
  1392. X              (nth 1 b)))
  1393. X      (if (>= (setq ediff (- ediff))
  1394. X          (+ calc-internal-prec calc-internal-prec))
  1395. X      (if (eq (nth 1 b) 0)
  1396. X          (Math-integer-negp (nth 1 a))
  1397. X        (Math-integer-posp (nth 1 b)))
  1398. X    (Math-lessp (nth 1 a)
  1399. X            (math-scale-int (nth 1 b) ediff)))))
  1400. )
  1401. X
  1402. ;;; True if A is numerically equal to B.  [P N N] [Public]
  1403. (defun math-equal (a b)
  1404. X  (= (math-compare a b) 0)
  1405. )
  1406. X
  1407. ;;; True if A is numerically less than B.  [P R R] [Public]
  1408. (defun math-lessp (a b)
  1409. X  (= (math-compare a b) -1)
  1410. )
  1411. X
  1412. ;;; True if A is numerically equal to the integer B.  [P N S] [Public]
  1413. ;;; B must not be a multiple of 10.
  1414. (defun math-equal-int (a b)
  1415. X  (or (eq a b)
  1416. X      (and (eq (car-safe a) 'float)
  1417. X       (eq (nth 1 a) b)
  1418. X       (= (nth 2 a) 0)))
  1419. )
  1420. X
  1421. X
  1422. X
  1423. X
  1424. ;;; Return the dimensions of a matrix as a list.  [l x] [Public]
  1425. (defun math-mat-dimens (m)
  1426. X  (if (math-vectorp m)
  1427. X      (if (math-matrixp m)
  1428. X      (cons (1- (length m))
  1429. X        (math-mat-dimens (nth 1 m)))
  1430. X    (list (1- (length m))))
  1431. X    nil)
  1432. )
  1433. X
  1434. X
  1435. X
  1436. (defun calc-binary-op-fancy (name func arg ident unary)
  1437. X  (let ((n (prefix-numeric-value arg)))
  1438. X    (cond ((> n 1)
  1439. X       (calc-enter-result n
  1440. X                  name
  1441. X                  (list 'calcFunc-reduce
  1442. X                    (math-calcFunc-to-var func)
  1443. X                    (cons 'vec (calc-top-list-n n)))))
  1444. X      ((= n 1)
  1445. X       (if unary
  1446. X           (calc-enter-result 1 name (list unary (calc-top-n 1)))))
  1447. X      ((= n 0)
  1448. X       (if ident
  1449. X           (calc-enter-result 0 name ident)
  1450. X         (error "Argument must be nonzero")))
  1451. X      (t
  1452. X       (let ((rhs (calc-top-n 1)))
  1453. X         (calc-enter-result (- 1 n)
  1454. X                name
  1455. X                (mapcar (function
  1456. X                     (lambda (x)
  1457. X                       (list func x rhs)))
  1458. X                    (calc-top-list-n (- n) 2)))))))
  1459. )
  1460. X
  1461. (defun calc-unary-op-fancy (name func arg)
  1462. X  (let ((n (prefix-numeric-value arg)))
  1463. X    (if (= n 0) (setq n (calc-stack-size)))
  1464. X    (cond ((> n 0)
  1465. X       (calc-enter-result n
  1466. X                  name
  1467. X                  (mapcar (function
  1468. X                       (lambda (x)
  1469. X                     (list func x)))
  1470. X                      (calc-top-list-n n))))
  1471. X      ((< n 0)
  1472. X       (calc-enter-result 1
  1473. X                  name
  1474. X                  (list func (calc-top-n (- n)))
  1475. X                  (- n)))))
  1476. )
  1477. X
  1478. X
  1479. X
  1480. (defvar var-Decls (list 'vec))
  1481. X
  1482. X
  1483. X
  1484. (setq math-simplify-only nil)
  1485. X
  1486. (defun math-inexact-result ()
  1487. X  (and calc-symbolic-mode
  1488. X       (signal 'inexact-result nil))
  1489. )
  1490. X
  1491. (defun math-overflow (&optional exp)
  1492. X  (if (and exp (math-negp exp))
  1493. X      (math-underflow)
  1494. X    (signal 'math-overflow nil))
  1495. )
  1496. X
  1497. (defun math-underflow ()
  1498. X  (signal 'math-underflow nil)
  1499. )
  1500. X
  1501. X
  1502. X
  1503. ;;; Compute the greatest common divisor of A and B.   [I I I] [Public]
  1504. (defun math-gcd (a b)
  1505. X  (cond ((not (or (consp a) (consp b)))
  1506. X     (if (< a 0) (setq a (- a)))
  1507. X     (if (< b 0) (setq b (- b)))
  1508. X     (let (c)
  1509. X       (if (< a b)
  1510. X           (setq c b b a a c))
  1511. X       (while (> b 0)
  1512. X         (setq c b
  1513. X           b (% a b)
  1514. X           a c))
  1515. X       a))
  1516. X    ((eq a 0) b)
  1517. X    ((eq b 0) a)
  1518. X    (t
  1519. X     (if (Math-integer-negp a) (setq a (math-neg a)))
  1520. X     (if (Math-integer-negp b) (setq b (math-neg b)))
  1521. X     (let (c)
  1522. X       (if (Math-natnum-lessp a b)
  1523. X           (setq c b b a a c))
  1524. X       (while (and (consp a) (not (eq b 0)))
  1525. X         (setq c b
  1526. X           b (math-imod a b)
  1527. X           a c))
  1528. X       (while (> b 0)
  1529. X         (setq c b
  1530. X           b (% a b)
  1531. X           a c))
  1532. X       a)))
  1533. )
  1534. X
  1535. X
  1536. ;;;; Algebra.
  1537. X
  1538. ;;; Evaluate variables in an expression.
  1539. (defun math-evaluate-expr (x)  ; [Public]
  1540. X  (if calc-embedded-info
  1541. X      (calc-embedded-evaluate-expr x)
  1542. X    (calc-normalize (math-evaluate-expr-rec x)))
  1543. )
  1544. (fset 'calcFunc-evalv (symbol-function 'math-evaluate-expr))
  1545. X
  1546. (defun calcFunc-evalvn (x &optional prec)
  1547. X  (if prec
  1548. X      (progn
  1549. X    (or (math-num-integerp prec)
  1550. X        (if (and (math-vectorp prec)
  1551. X             (= (length prec) 2)
  1552. X             (math-num-integerp (nth 1 prec)))
  1553. X        (setq prec (math-add (nth 1 prec) calc-internal-prec))
  1554. X          (math-reject-arg prec 'integerp)))
  1555. X    (setq prec (math-trunc prec))
  1556. X    (if (< prec 3) (setq prec 3))
  1557. X    (if (> prec calc-internal-prec)
  1558. X        (math-normalize
  1559. X         (let ((calc-internal-prec prec))
  1560. X           (calcFunc-evalvn x)))
  1561. X      (let ((calc-internal-prec prec))
  1562. X        (calcFunc-evalvn x))))
  1563. X    (let ((calc-symbolic-mode nil))
  1564. X      (math-evaluate-expr x)))
  1565. )
  1566. X
  1567. (defun math-evaluate-expr-rec (x)
  1568. X  (if (consp x)
  1569. X      (if (memq (car x) '(calcFunc-quote calcFunc-condition
  1570. X                     calcFunc-evalto calcFunc-assign))
  1571. X      (if (and (eq (car x) 'calcFunc-assign)
  1572. X           (= (length x) 3))
  1573. X          (list (car x) (nth 1 x) (math-evaluate-expr-rec (nth 2 x)))
  1574. X        x)
  1575. X    (if (eq (car x) 'var)
  1576. X        (if (and (calc-var-value (nth 2 x))
  1577. X             (not (eq (car-safe (symbol-value (nth 2 x)))
  1578. X                  'incomplete)))
  1579. X        (let ((val (symbol-value (nth 2 x))))
  1580. X          (if (eq (car-safe val) 'special-const)
  1581. X              (if calc-symbolic-mode
  1582. X              x
  1583. X            val)
  1584. X            val))
  1585. X          x)
  1586. X      (if (Math-primp x)
  1587. X          x
  1588. X        (cons (car x) (mapcar 'math-evaluate-expr-rec (cdr x))))))
  1589. X    x)
  1590. )
  1591. X
  1592. X
  1593. X
  1594. (setq math-simplifying nil)
  1595. (setq math-living-dangerously nil)   ; true if unsafe simplifications are okay.
  1596. (setq math-integrating nil)
  1597. X
  1598. X
  1599. X
  1600. X
  1601. (defmacro math-defsimplify (funcs &rest code)
  1602. X  (append '(progn (math-need-std-simps))
  1603. X      (mapcar (function
  1604. X           (lambda (func)
  1605. X             (list 'put (list 'quote func) ''math-simplify
  1606. X               (list 'nconc
  1607. X                 (list 'get (list 'quote func) ''math-simplify)
  1608. X                 (list 'list
  1609. X                       (list 'function
  1610. X                         (append '(lambda (expr))
  1611. X                             code)))))))
  1612. X          (if (symbolp funcs) (list funcs) funcs)))
  1613. )
  1614. (put 'math-defsimplify 'lisp-indent-hook 1)
  1615. X
  1616. X
  1617. (defun math-any-floats (expr)
  1618. X  (if (Math-primp expr)
  1619. X      (math-floatp expr)
  1620. X    (while (and (setq expr (cdr expr)) (not (math-any-floats (car expr)))))
  1621. X    expr)
  1622. )
  1623. X
  1624. (defvar var-FactorRules 'calc-FactorRules)
  1625. X
  1626. X
  1627. X
  1628. (defun math-map-tree (mmt-func mmt-expr &optional mmt-many)
  1629. X  (or mmt-many (setq mmt-many 1000000))
  1630. X  (math-map-tree-rec mmt-expr)
  1631. )
  1632. X
  1633. (defun math-map-tree-rec (mmt-expr)
  1634. X  (or (= mmt-many 0)
  1635. X      (let ((mmt-done nil)
  1636. X        mmt-nextval)
  1637. X    (while (not mmt-done)
  1638. X      (while (and (/= mmt-many 0)
  1639. X              (setq mmt-nextval (funcall mmt-func mmt-expr))
  1640. X              (not (equal mmt-expr mmt-nextval)))
  1641. X        (setq mmt-expr mmt-nextval
  1642. X          mmt-many (if (> mmt-many 0) (1- mmt-many) (1+ mmt-many))))
  1643. X      (if (or (Math-primp mmt-expr)
  1644. X          (<= mmt-many 0))
  1645. X          (setq mmt-done t)
  1646. X        (setq mmt-nextval (cons (car mmt-expr)
  1647. X                    (mapcar 'math-map-tree-rec
  1648. X                        (cdr mmt-expr))))
  1649. X        (if (equal mmt-nextval mmt-expr)
  1650. X        (setq mmt-done t)
  1651. X          (setq mmt-expr mmt-nextval))))))
  1652. X  mmt-expr
  1653. )
  1654. X
  1655. X
  1656. X
  1657. X
  1658. (setq math-rewrite-selections nil)
  1659. X
  1660. (defun math-is-true (expr)
  1661. X  (if (Math-numberp expr)
  1662. X      (not (Math-zerop expr))
  1663. X    (math-known-nonzerop expr))
  1664. )
  1665. X
  1666. (defun math-const-var (expr)
  1667. X  (and (consp expr)
  1668. X       (eq (car expr) 'var)
  1669. X       (or (and (symbolp (nth 2 expr))
  1670. X        (boundp (nth 2 expr))
  1671. X        (eq (car-safe (symbol-value (nth 2 expr))) 'special-const))
  1672. X       (memq (nth 2 expr) '(var-inf var-uinf var-nan))))
  1673. )
  1674. X
  1675. X
  1676. X
  1677. X
  1678. (defmacro math-defintegral (funcs &rest code)
  1679. X  (setq math-integral-cache nil)
  1680. X  (append '(progn)
  1681. X      (mapcar (function
  1682. X           (lambda (func)
  1683. X             (list 'put (list 'quote func) ''math-integral
  1684. X               (list 'nconc
  1685. X                 (list 'get (list 'quote func) ''math-integral)
  1686. X                 (list 'list
  1687. X                       (list 'function
  1688. X                         (append '(lambda (u))
  1689. X                             code)))))))
  1690. X          (if (symbolp funcs) (list funcs) funcs)))
  1691. )
  1692. (put 'math-defintegral 'lisp-indent-hook 1)
  1693. X
  1694. (defmacro math-defintegral-2 (funcs &rest code)
  1695. X  (setq math-integral-cache nil)
  1696. X  (append '(progn)
  1697. X      (mapcar (function
  1698. X           (lambda (func)
  1699. X             (list 'put (list 'quote func) ''math-integral-2
  1700. X               (list 'nconc
  1701. X                 (list 'get (list 'quote func)
  1702. X                       ''math-integral-2)
  1703. X                 (list 'list
  1704. X                       (list 'function
  1705. X                         (append '(lambda (u v))
  1706. X                             code)))))))
  1707. X          (if (symbolp funcs) (list funcs) funcs)))
  1708. )
  1709. (put 'math-defintegral-2 'lisp-indent-hook 1)
  1710. X
  1711. X
  1712. (defvar var-IntegAfterRules 'calc-IntegAfterRules)
  1713. X
  1714. X
  1715. (defvar var-FitRules 'calc-FitRules)
  1716. X
  1717. X
  1718. (setq math-poly-base-variable nil)
  1719. (setq math-poly-neg-powers nil)
  1720. (setq math-poly-mult-powers 1)
  1721. (setq math-poly-frac-powers nil)
  1722. (setq math-poly-exp-base nil)
  1723. X
  1724. X
  1725. X
  1726. X
  1727. (defun math-build-var-name (name)
  1728. X  (if (stringp name)
  1729. X      (setq name (intern name)))
  1730. X  (if (string-match "\\`var-." (symbol-name name))
  1731. X      (list 'var (intern (substring (symbol-name name) 4)) name)
  1732. X    (list 'var name (intern (concat "var-" (symbol-name name)))))
  1733. )
  1734. X
  1735. (setq math-simplifying-units nil)
  1736. (setq math-combining-units t)
  1737. X
  1738. X
  1739. (put 'math-while 'lisp-indent-hook 1)
  1740. (put 'math-for 'lisp-indent-hook 1)
  1741. (put 'math-foreach 'lisp-indent-hook 1)
  1742. X
  1743. X
  1744. ;;; Nontrivial number parsing.
  1745. X
  1746. (defun math-read-number-fancy (s)
  1747. X  (cond
  1748. X
  1749. X   ;; Integer+fractions
  1750. X   ((string-match "^\\([0-9]*\\)[:/]\\([0-9]*\\)[:/]\\([0-9]*\\)$" s)
  1751. X    (let ((int (math-match-substring s 1))
  1752. X      (num (math-match-substring s 2))
  1753. X      (den (math-match-substring s 3)))
  1754. X      (let ((int (if (> (length int) 0) (math-read-number int) 0))
  1755. X        (num (if (> (length num) 0) (math-read-number num) 1))
  1756. X        (den (if (> (length num) 0) (math-read-number den) 1)))
  1757. X    (and int num den
  1758. X         (math-integerp int) (math-integerp num) (math-integerp den)
  1759. X         (not (math-zerop den))
  1760. X         (list 'frac (math-add num (math-mul int den)) den)))))
  1761. X   
  1762. X   ;; Fractions
  1763. X   ((string-match "^\\([0-9]*\\)[:/]\\([0-9]*\\)$" s)
  1764. X    (let ((num (math-match-substring s 1))
  1765. X      (den (math-match-substring s 2)))
  1766. X      (let ((num (if (> (length num) 0) (math-read-number num) 1))
  1767. X        (den (if (> (length num) 0) (math-read-number den) 1)))
  1768. X    (and num den (math-integerp num) (math-integerp den)
  1769. X         (not (math-zerop den))
  1770. X         (list 'frac num den)))))
  1771. X   
  1772. X   ;; Modulo forms
  1773. X   ((string-match "^\\(.*\\) *mod *\\(.*\\)$" s)
  1774. X    (let* ((n (math-match-substring s 1))
  1775. X       (m (math-match-substring s 2))
  1776. X       (n (math-read-number n))
  1777. X       (m (math-read-number m)))
  1778. X      (and n m (math-anglep n) (math-anglep m)
  1779. X       (list 'mod n m))))
  1780. X
  1781. X   ;; Error forms
  1782. X   ((string-match "^\\(.*\\) *\\+/- *\\(.*\\)$" s)
  1783. X    (let* ((x (math-match-substring s 1))
  1784. X       (sigma (math-match-substring s 2))
  1785. X       (x (math-read-number x))
  1786. X       (sigma (math-read-number sigma)))
  1787. X      (and x sigma (math-scalarp x) (math-anglep sigma)
  1788. X       (list 'sdev x sigma))))
  1789. X
  1790. X   ;; Hours (or degrees)
  1791. X   ((or (string-match "^\\([^#^]+\\)[@oOhH]\\(.*\\)$" s)
  1792. X    (string-match "^\\([^#^]+\\)[dD][eE]?[gG]?\\(.*\\)$" s))
  1793. X    (let* ((hours (math-match-substring s 1))
  1794. X       (minsec (math-match-substring s 2))
  1795. X       (hours (math-read-number hours))
  1796. X       (minsec (if (> (length minsec) 0) (math-read-number minsec) 0)))
  1797. X      (and hours minsec
  1798. X       (math-num-integerp hours)
  1799. X       (not (math-negp hours)) (not (math-negp minsec))
  1800. X       (cond ((math-num-integerp minsec)
  1801. X          (and (Math-lessp minsec 60)
  1802. X               (list 'hms hours minsec 0)))
  1803. X         ((and (eq (car-safe minsec) 'hms)
  1804. X               (math-zerop (nth 1 minsec)))
  1805. X          (math-add (list 'hms hours 0 0) minsec))
  1806. X         (t nil)))))
  1807. X   
  1808. X   ;; Minutes
  1809. X   ((string-match "^\\([^'#^]+\\)[mM']\\(.*\\)$" s)
  1810. X    (let* ((minutes (math-match-substring s 1))
  1811. X       (seconds (math-match-substring s 2))
  1812. X       (minutes (math-read-number minutes))
  1813. X       (seconds (if (> (length seconds) 0) (math-read-number seconds) 0)))
  1814. X      (and minutes seconds
  1815. X       (math-num-integerp minutes)
  1816. X       (not (math-negp minutes)) (not (math-negp seconds))
  1817. X       (cond ((math-realp seconds)
  1818. X          (and (Math-lessp minutes 60)
  1819. X               (list 'hms 0 minutes seconds)))
  1820. X         ((and (eq (car-safe seconds) 'hms)
  1821. X               (math-zerop (nth 1 seconds))
  1822. X               (math-zerop (nth 2 seconds)))
  1823. X          (math-add (list 'hms 0 minutes 0) seconds))
  1824. X         (t nil)))))
  1825. X   
  1826. X   ;; Seconds
  1827. X   ((string-match "^\\([^\"#^]+\\)[sS\"]$" s)
  1828. X    (let ((seconds (math-read-number (math-match-substring s 1))))
  1829. X      (and seconds (math-realp seconds)
  1830. X       (not (math-negp seconds))
  1831. X       (Math-lessp seconds 60)
  1832. X       (list 'hms 0 0 seconds))))
  1833. X   
  1834. X   ;; Integer+fraction with explicit radix
  1835. X   ((string-match "^\\([0-9]+\\)\\(#\\|\\^\\^\\)\\([0-9a-zA-Z]*\\)[:/]\\([0-9a-zA-Z]*\\)[:/]\\([0-9a-zA-Z]\\)$" s)
  1836. X    (let ((radix (string-to-int (math-match-substring s 1)))
  1837. X      (int (math-match-substring s 3))
  1838. X      (num (math-match-substring s 4))
  1839. X      (den (math-match-substring s 5)))
  1840. X      (let ((int (if (> (length int) 0) (math-read-radix int radix) 0))
  1841. X        (num (if (> (length num) 0) (math-read-radix num radix) 1))
  1842. X        (den (if (> (length den) 0) (math-read-radix den radix) 1)))
  1843. X    (and int num den (not (math-zerop den))
  1844. X         (list 'frac
  1845. X           (math-add num (math-mul int den))
  1846. X           den)))))
  1847. X   
  1848. X   ;; Fraction with explicit radix
  1849. X   ((string-match "^\\([0-9]+\\)\\(#\\|\\^\\^\\)\\([0-9a-zA-Z]*\\)[:/]\\([0-9a-zA-Z]*\\)$" s)
  1850. X    (let ((radix (string-to-int (math-match-substring s 1)))
  1851. X      (num (math-match-substring s 3))
  1852. X      (den (math-match-substring s 4)))
  1853. X      (let ((num (if (> (length num) 0) (math-read-radix num radix) 1))
  1854. X        (den (if (> (length den) 0) (math-read-radix den radix) 1)))
  1855. X    (and num den (not (math-zerop den)) (list 'frac num den)))))
  1856. X   
  1857. X   ;; Float with explicit radix and exponent
  1858. X   ((or (string-match "^0*\\(\\([2-9]\\|1[0-4]\\)\\(#\\|\\^\\^\\)[0-9a-dA-D.]+\\)[eE]\\([-+]?[0-9]+\\)$" s)
  1859. X    (string-match "^\\(\\([0-9]+\\)\\(#\\|\\^\\^\\)[0-9a-zA-Z.]+\\) *\\* *\\2\\.? *\\^ *\\([-+]?[0-9]+\\)$" s))
  1860. X    (let ((radix (string-to-int (math-match-substring s 2)))    
  1861. X      (mant (math-match-substring s 1))
  1862. X      (exp (math-match-substring s 4)))
  1863. X      (let ((mant (math-read-number mant))
  1864. X        (exp (math-read-number exp)))
  1865. X    (and mant exp
  1866. X         (math-mul mant (math-pow (math-float radix) exp))))))
  1867. X
  1868. X   ;; Float with explicit radix, no exponent
  1869. X   ((string-match "^\\([0-9]+\\)\\(#\\|\\^\\^\\)\\([0-9a-zA-Z]*\\)\\.\\([0-9a-zA-Z]*\\)$" s)
  1870. X    (let ((radix (string-to-int (math-match-substring s 1)))
  1871. X      (int (math-match-substring s 3))
  1872. X      (fracs (math-match-substring s 4)))
  1873. X      (let ((int (if (> (length int) 0) (math-read-radix int radix) 0))
  1874. X        (frac (if (> (length fracs) 0) (math-read-radix fracs radix) 0))
  1875. X        (calc-prefer-frac nil))
  1876. X    (and int frac
  1877. X         (math-add int (math-div frac (math-pow radix (length fracs))))))))
  1878. X
  1879. X   ;; Integer with explicit radix
  1880. X   ((string-match "^\\([0-9]+\\)\\(#\\|\\^\\^\\)\\([0-9a-zA-Z]+\\)$" s)
  1881. X    (math-read-radix (math-match-substring s 3)
  1882. X             (string-to-int (math-match-substring s 1))))
  1883. X
  1884. X   ;; C language hexadecimal notation
  1885. X   ((and (eq calc-language 'c)
  1886. X     (string-match "^0[xX]\\([0-9a-fA-F]+\\)$" s))
  1887. X    (let ((digs (math-match-substring s 1)))
  1888. X      (math-read-radix digs 16)))
  1889. X
  1890. X   ;; Pascal language hexadecimal notation
  1891. X   ((and (eq calc-language 'pascal)
  1892. X     (string-match "^\\$\\([0-9a-fA-F]+\\)$" s))
  1893. X    (let ((digs (math-match-substring s 1)))
  1894. X      (math-read-radix digs 16)))
  1895. X
  1896. X   ;; Fraction using "/" instead of ":"
  1897. X   ((string-match "^\\([0-9]+\\)/\\([0-9/]+\\)$" s)
  1898. X    (math-read-number (concat (math-match-substring s 1) ":"
  1899. X                  (math-match-substring s 2))))
  1900. X
  1901. X   ;; Syntax error!
  1902. X   (t nil))
  1903. )
  1904. X
  1905. (defun math-read-radix (s r)   ; [I X D]
  1906. X  (catch 'gonzo
  1907. X    (math-read-radix-loop (upcase s) (1- (length s)) r))
  1908. )
  1909. X
  1910. (defun math-read-radix-loop (s i r)   ; [I X S D]
  1911. X  (if (< i 0)
  1912. X      0
  1913. X    (let ((dig (math-read-radix-digit (elt s i))))
  1914. X      (if (and dig (< dig r))
  1915. X      (math-add (math-mul (math-read-radix-loop s (1- i) r)
  1916. X                  r)
  1917. X            dig)
  1918. X    (throw 'gonzo nil))))
  1919. )
  1920. X
  1921. X
  1922. X
  1923. ;;; Expression parsing.
  1924. X
  1925. (defun math-read-expr (exp-str)
  1926. X  (let ((exp-pos 0)
  1927. X    (exp-old-pos 0)
  1928. X    (exp-keep-spaces nil)
  1929. X    exp-token exp-data)
  1930. X    (while (setq exp-token (string-match "\\.\\." exp-str))
  1931. X      (setq exp-str (concat (substring exp-str 0 exp-token) "\\dots"
  1932. X                (substring exp-str (+ exp-token 2)))))
  1933. X    (math-read-token)
  1934. X    (let ((val (catch 'syntax (math-read-expr-level 0))))
  1935. X      (if (stringp val)
  1936. X      (list 'error exp-old-pos val)
  1937. X    (if (equal exp-token 'end)
  1938. X        val
  1939. X      (list 'error exp-old-pos "Syntax error")))))
  1940. )
  1941. X
  1942. (defun math-read-plain-expr (exp-str &optional error-check)
  1943. SHAR_EOF
  1944. true || echo 'restore of calc-ext.el failed'
  1945. fi
  1946. echo 'End of  part 14'
  1947. echo 'File calc-ext.el is continued in part 15'
  1948. echo 15 > _shar_seq_.tmp
  1949. exit 0
  1950. exit 0 # Just in case...
  1951. -- 
  1952. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  1953. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  1954. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  1955. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  1956.